package main

import (
	"fmt"
	"math/rand"
	"sort"
)

type Hero struct {
	Name string
	Age  int
}

type HeroSlice []Hero

func (hs HeroSlice) Len() int {
	return len(hs)
}

// Less 方法就是决定你使用什么标准进行排序
func (hs HeroSlice) Less(i, j int) bool {
	return hs[i].Age < hs[j].Age
}

func (hs HeroSlice) Swap(i, j int) {
	// 交换
	// temp := hs[i]
	// hs[i] = hs[j]
	// hs[j] = temp
	hs[i], hs[j] = hs[j], hs[i]
}

// 结构体切片排序
func main() {
	//先定义一个数组/切片
	var intSlice = []int{0, -1, 10, 7, 100}
	//要求对他排序
	//1.冒泡排序
	//2.也可以用系统方法
	sort.Ints(intSlice)
	fmt.Println(intSlice)

	//要求对结构体切片进行排序
	//1.冒泡排序
	//2.系统方法
	var heroes HeroSlice
	for i := 0; i < 10; i++ {
		hero := Hero{
			Name: fmt.Sprintf("英雄~%d", rand.Intn(100)),
			Age:  rand.Intn(100),
		}
		heroes = append(heroes, hero)
	}

	//排序前的顺序
	for _, v := range heroes {
		fmt.Println(v)
	}
	//调用sort.Sort方法
	sort.Sort(heroes)
	for _, v := range heroes {
		fmt.Println(v)
	}
}
